class Vue{ 
	constructor (options) {
	    // 通过属性保存选项的数据
		this.$options = options || {}
		this.$data = options.data || {}
		this.$el = typeof options.el === 'string' ? document.querySelector(options.el) : options.el
		this.$methods = options.methods || {}
		// 把data成员转化成getter / setter 注入到data的实例中
		this._proxyData(this.$data)
		this._proxyData(this.$methods)
		// 调用 observer 监听数据变化
		new Observer(this.$data)
		
		// 调用 compiler 解析指令和差值表达式
		new Compiler(this)
		
	}
	_proxyData (data) {
		// 遍历data的所有属性
		Object.keys(data).forEach(key => {
			// 把data的属性注入到vue实例中
			Object.defineProperty(this,key,{
				enumberable:true, // 是否可遍历
				configurable:true, // 是否可枚举
				get (){ // 访问数据
					return data[key]
				},
				set (newValue) {
					if (data[key] === newValue) return
					data[key] = newValue
				}
				
			})
		})
		
	}
	
}












